PDC 2008

Direct3D 10.1 リモート レンダリング

更新日: 2009 年 4 月 28 日


ダウンロード

PDC08_D3D10_Remote_Rendering_JPN.docx (Word 形式、183 KB)


Mary Luo、Daniel Wood、Max McMullen
Microsoft Corporation
2008 年 10 月

対象:

Windows® 7

要約:

このホワイト ペーパーでは、Direct3D 10.1 ベースのアプリケーションを開発する開発者向けに、Direct3D 10.1 リモート レンダリング (Remote Rendering) の全般的な概要を説明します。開発者は、Direct3D 10.1 リモート レンダリングと従来のビットマップ リモート ディスプレイ (bitmap remote display) の機能上およびパフォーマンス上のメリットを比較できるだけでなく、リモート ハードウェア アクセラレータにすることができる Direct3D 10.1 アプリケーションを実装するためのハウツー ガイドとして利用できます。また、サンプル ユーザー シナリオと擬似コードを用意し、Direct3D 10.1 リモート レンダリングの要件と使用上の詳細を例を挙げて示しています。

法的通知:

このドキュメントは暫定版であり、このソフトウェアの最終的な製品版の発売時に実質的に変更されることがあります。
このドキュメントに記載されている情報は、このドキュメントの発行時点におけるマイクロソフトの見解を反映したものです。変化する市場状況に対応する必要があるため、このドキュメントは、記載された内容の実現に関するマイクロソフトの確約とはみなされないものとします。また、発行以降に発表される情報の正確性に関して、マイクロソフトはいかなる保証もいたしません。
このホワイト ペーパーに記載された内容は情報の提供のみを目的としており、明示、黙示または法律の規定にかかわらず、これらの情報についてマイクロソフトはいかなる責任も負わないものとします。
お客様ご自身の責任において、 適用されるすべての著作権関連法規に従ったご使用を願います。このドキュメントのいかなる部分も、米国 Microsoft Corporation の書面による許諾を受けることなく、その目的を問わず、どのような形態であっても、複製または譲渡することは禁じられています。ここでいう形態とは、複写や記録など、電子的な、または物理的なすべての手段を含みます。ただしこれは、著作権法上のお客様の権利を制限するものではありません。
マイクロソフトは、このドキュメントに記載されている内容に関し、特許、特許申請、商標、著作権、またはその他の無体財産権を有する場合があります。別途マイクロソフトのライセンス契約上に明示の規定のない限り、このドキュメントはこれらの特許、商標、著作権、またはその他の無体財産権をお客様に許諾するものではありません。
© 2008 Microsoft Corporation. All rights reserved.
Microsoft、MS-DOS、Windows、Windows NT、Windows Server、Windows Vista、Active Directory、ActiveSync、ActiveX、Direct3D、DirectDraw、DirectInput、DirectMusic、DirectPlay、DirectShow、DirectSound、DirectX、Expression、FrontPage、HighMAT、Internet Explorer、JScript、Microsoft Press、MSN、Outlook、PowerPoint、SideShow、Silverlight、Visual Basic、Visual C++、Visual InterDev、Visual J++、Visual Studio、WebTV、Windows Media、Win32、Win32s、および Zune は米国 Microsoft Corporation の米国またはその他の国における登録商標または商標です。
記載されている会社名、製品名には、各社の商標のものもあります。


目次:

  1. はじめに
    1. リッチ クライアントのリモート ディスプレイ
    2. アプリケーション パフォーマンスの向上
    3. 使用方法
  1. 詳細
    1. リモート ディスプレイのシナリオ
    2. Direct3D 10.1 リモート レンダリングのパフォーマンス
  1. まとめ
  2. 実施要請
  3. 詳細情報



1. はじめに

Direct3D® 10.1 リモート レンダリング (Remote Rendering) とは、サーバーに格納されている Direct3D 10.1 アプリケーションの API コマンドを、ハードウェア アクセラレータを備えたディスプレイ用にリモート クライアントに送信できる Direct3D 10.1 の拡張機能のことです。アプリケーションは、Direct3D 10.1 リモート レンダリングを導入することで、ネットワーク経由のディスプレイ パフォーマンスをより適切に最適化することを選択できます。

a. リッチ クライアントのリモート ディスプレイ

Direct3D 10.1 リモート レンダリングは、リモート クライアントのグラフィック プロセッサを使用することによって、Direct3D 10.1 API をハードウェア アクセラレータにすることができるため、リッチ クライアントのリモート デスクトップやリモート アプリケーションに適しています。Direct3D 10.1 リモート レンダリングは、従来のビットマップ リモート ディスプレイ (bitmap remote display) と違って、サーバーにグラフィック ハードウェアを必要とせず、アプリケーション開発者は、さまざまなネットワーク帯域幅やリッチ クライアントのコンピューターの能力に合わせて、ディスプレイ エクスペリエンスを最適化できます。

b. アプリケーション パフォーマンスの向上

Direct3D 10.1 リモート レンダリングにより、アプリケーションは、1 秒あたりのフレーム数 (fps)、ネットワーク帯域幅の使用率と拡張性、およびリモート クライアントの印象的なビジュアル ディスプレイの観点から、ディスプレイ パフォーマンスをより適切に最適化することができます。Direct3D 10.1 リモート レンダリングのメリットは、Direct3D 10.1 を基に構築されている Direct2D API に直接反映されます。サンプルの結果では、Direct2D テキスト レンダリングとジオメトリ レンダリングのパフォーマンスに関して、Direct3D 10.1 リモート レンダリングがビットマップ リモート ディスプレイを上回っていることが示されています。

c. 使用方法

Direct3D 10.1 リモート レンダリングによってパフォーマンスが向上するというメリットを活かすために、アプリケーション開発者は、アプリケーションからコンテンツを更新する際の API 呼び出し回数やリソースの初期化回数が制限されている場合に、Direct3D 10.1 リモート レンダリングを使用することを検討してください。Direct3D 10.1 リモート レンダリングの使用を選択し、リモート セッションの遷移を処理するために、アプリケーションでは、DXGI 1.1 の新しい API 呼び出しを行う必要があります。また、サンプル アプリケーション プログラムで例を示すように、リモート レンダリング中は、API 機能で必要とされるバリエーションに合わせてアプリケーションを調整する必要があります。

システムで Direct3D 10.1 リモート レンダリング機能が使える場合、ターミナル サービスのシナリオでは、Direct2D アプリケーションは Direct3D 10.1 リモート レンダリングを既定で使用します。セッションの遷移処理は、Direct2D ランタイムによって簡素化されます。サンプルの Direct2D アプリケーションを変更して、Direct2D 開発者が Direct3D 10.1 リモート レンダリングを使用する方法の例を示します。

ページのトップへ


2. 詳細

ここでは、Direct3D® 10.1 リモート レンダリングをどのようなときに使用できるか、リモート レンダリングが役に立つ理由、および Direct3D 10.1 リモート レンダリングを使用するアプリケーションを開発者がプログラミングする方法について詳しく説明します。

a. リモート ディスプレイのシナリオ

Microsoft® Windows® では、ネットワーク接続経由でデスクトップ全体または 1 つのアプリケーションを転送するために、ターミナル サービス対応のリモート デスクトップ接続とリモート アプリケーションが提供されます。複数のアクセス ポイントと使用法のプロファイルを備え、一元管理される、アプリケーションとデータの記憶域を必要とするアプリケーションは、クライアント サーバーのシナリオで開発されます。このようなサンプルには、1 台のワークステーションに単一ライセンスで生産性向上アプリケーションをインストールし複数のユーザーが使用するシナリオや、オフィスで使用されるアプリケーションに自宅や遠隔地からアクセスするシナリオがあります。

リッチ クライアントとシン クライアント

アプリケーションの開発者は、次の 2 つの主要なクライアント サーバー アーキテクチャの一方、もしくは両方に合わせて、リモート ディスプレイのサポートを調節できます。

シン クライアント: Windows Vista 以降、Direct3D API はサーバーのグラフィック プロセッサとドライバーによってピクセルに変換されてから、ビットマップとしてリモート クライアントに送信されます (これを "ビットマップ リモート ディスプレイ" と呼びます)。グラフィック処理がクライアントではなくサーバー上で行われるため、ビットマップ リモート ディスプレイは、さまざまなグラフィック機能を持つクライアント コンピューターに使用できます。サーバーに複数のクライアントが接続している場合は、使用可能なサーバー リソースの量とネットワーク帯域幅によって、ビットマップ リモート ディスプレイのディスプレイ エクスペリエンスは非常に低下しやすくなります。

リッチ クライアント: Direct3D 10.1 リモート レンダリングでは、リモート クライアントのグラフィック プロセッサを使用して、Direct3D 10.1 API をハードウェア アクセラレータにすることができます。そのため、Direct3D 10.1 アプリケーションを格納するサーバー コンピューターに、グラフィック プロセッサやドライバーを搭載する必要はありません (ヘッドレス サーバーなど)。限られた API コマンドやリソースを使用して大量のコンテンツを更新するよう設計されているアプリケーションでは、ネットワーク帯域幅の消費を大幅に減らすことができ、複数のクライアントがサーバーに接続する際のユーザー エクスペリエンスを向上させることができます。また、グラフィック処理がサーバーではなくクライアントで行われるため、サーバーのグラフィック プロセッサの能力によって、複数のクライアント接続がボトルネックになることがありません。

接続クライアント数

Direct3D 10.1 リモート レンダリングを適切に使用するように設計されているアプリケーションのメリットは、同じサーバーに接続するクライアント数が増加するとより顕著に表れます。次のグラフは、ビットマップ リモート ディスプレイまたは Direct3D 10.1 リモート レンダリングを使用して Direct3D 10.1 アプリケーションをリモートで表示した場合に、1 秒あたりの平均フレーム数 (fps) が、サーバーに接続するクライアント数と比較してどのように変化するかを示しています。

リモート クライアント数によるディスプレイ パフォーマンスへの影響

グラフが示すように、ビットマップ リモート ディスプレイは、サーバーへの同時接続クライアント数が増加するにしたがって、1 秒あたりのフレーム数が低下しており、このことからディスプレイ パフォーマンスが低下しやすくなっています。

以下に、Direct3D 10.1 リモート レンダリングAPI とビットマップ リモート ディスプレイを使用した場合を比較した表を示します。つまり、Windows Vista® における従来の Direct3D リモート ディスプレイのメカニズムと Windows 7 のメカニズムを比較していることになります。

  Direct3D 10.1 ビットマップ リモート ディスプレイ Direct3D 10.1 リモート レンダリング
サーバーのグラフィック ハードウェア WDDM ドライバーが必須 なし
クライアントのグラフィック ハードウェア なし WDDM ドライバーが必須
複数のクライアントへの拡張性 適切な拡張性なし アプリケーションの設計により拡張性あり
ビジュアル エクスペリエンス サーバーの能力、ネットワーク帯域幅、接続クライアント数によって制限される アプリケーション開発者が最適化可能

Direct3D 10.1 リモート レンダリングを追加することでメリットを得られるアプリケーションのシナリオとは、リッチ クライアント コンピューターのグラフィック ハードウェアを活用する場合です。つまり、サーバーから GPU や汎用処理の負荷を取り除き、さまざまなネットワーク帯域幅接続に合わせてビジュアル エクスペリエンスをカスタマイズする場合です。

ページのトップへ


b. Direct3D 10.1 リモート レンダリングのパフォーマンス

アプリケーションの開発者は、リモート ディスプレイのさまざまなユーザー シナリオに合わせて、Direct3D 10.1 アプリケーションまたは Direct2D アプリケーションを最適化する方法を決めなければなりません。アプリケーションで DXGI API を呼び出すか、Direct2D API を呼び出すことによって、Direct3D 10.1 リモート レンダリングを使用できます。

  1. Direct3D 10.1 アプリケーション - Direct3D 10.1 リモート レンダリングの使用方法
  2. Direct3D 10.1 アプリケーション - リモート グラフィック アダプターの列挙
  3. Direct2D アプリケーションで Direct3D 10.1 リモート レンダリングを使用する

(1) Direct3D 10.1 アプリケーション - Direct3D 10.1 リモート レンダリングの使用方法

リモート グラフィック アダプターで Direct3D 10.1 レンダリングを有効にするために、Direct3D 10.1 アプリケーションでは、リモート グラフィック アダプターを列挙し、リモート グラフィック アダプターで Direct3D 10.1 デバイスを作成して、リモート セッションの遷移を処理するためにアダプターを再度列挙する必要があります。

(2) Direct3D 10.1 アプリケーション - リモート グラフィック アダプターの列挙

Direct3D 10.1 API を使用してリモート処理するアプリケーションでは、IDXGIFactory1 (DXGI 1.1 で定義される新しい DXGI ファクトリ インターフェイス) の REFIID という新しいパラメーターを指定して、CreateDXGIFactory1 を明示的に呼び出す必要があります。アプリケーションでは、必ず最新の dxgi.h をインクルードします。IDXGIFactory1 オブジェクトにより、(存在する) すべてのリモート アダプターを列挙できます。

IDXGIFactory1* g_pFactory = NULL;

HRESULT hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)(&g_pFactory));

アプリケーションから CreateDXGIFactory を明示的に呼び出した場合、IDXGIFactory の REFIID を指定して CreateDXGIFactory1 を呼び出した場合、または単に CreateD3D10Device1CreateD3D10DeviceandSwapchain1 を呼び出した場合 (このような呼び出しを行うと、暗黙に IDXGIFactory の REFIID を指定して CreateDXGIFactory が呼び出されます)、既定では、いずれも Direct3D 10.1 リモート レンダリングを使用しないことになります。

アプリケーションは、列挙されたアダプターの一覧をスキャンすることで、使用する特定のリモート アダプターを選択できます。FindBestAdapter 関数の擬似コードでは、Direct3D 10.1 リモート レンダリングを選択する方法の例を示します。IDXGIFactory1::EnumAdapters は、モニターが接続されているリモート アダプター (使用可能な場合)、モニターが接続されていないリモート アダプター (使用可能な場合)、ローカル アダプターの順に、使用可能なアダプターの一覧を返します。アダプターの列挙の詳しい説明については、「DXGI 1.1 でのアダプターの列挙」を参照してください。

IDXGIAdapter1* g_pCurrentAdapter = NULL;

g_pCurrentAdapter = FindBestAdapter();

// Direct3D 10.1 デバイスの作成対象として最も適切な

// グラフィック アダプターを検索します。

IDXGIAdapter1* FindBestAdapter1()

{

// g_vAdapters1 配列内にすべてのアダプターを列挙して格納します。

while(g_pFactory->EnumAdapters(i, &pAdapter) != DXGI_ERROR_NOT_FOUND) 

{ 

    g_vAdapters[i] = pAdapter; 

    ++i; 

}

// D3D10.1 リモート レンダリングを使用するために、検出された最初のアダプターを

// 使用して D3D10.1 デバイスを作成します。まず、最初のアダプターで、D3D10.1 

// デバイスの作成を試み、成功したら停止します。

if (g_vAdapters[0])

{

    hr = D3D10CreateDevice1(

            g_vAdapters[0], 

            D3D10_DRIVER_TYPE_HARDWARE, 

            NULL, 

            0, 

            D3D10_FEATURE_LEVEL_*_*,//10.1、10.0、9.3、9.2、または 9.1 を反復処理します。

            D3D10_1_SDK_VERSION, 

            &g_pd3dDevice1);

    if (SUCCEEDED(hr))

        return g_vAdapters[0];

}   

// 列挙された他のアダプターで D3D10.1 デバイスの作成を繰り返します。

...

}

適切なアダプターを取得したら、D3D10CreateDevice1 または D3D10CreateDeviceAndSwapchain1 を呼び出すことによって、Direct3D 10.1 デバイスを作成できます。

Direct3D 10.1 リモート レンダリングを使用しない場合は、Direct3D 10.1 デバイスの作成前にアダプターがローカルであることを確認するために、アダプターの説明を照会できます。アプリケーションでは、IDXGIAdapter1::GetDesc(DXGI_ADAPTER_DESC1*) を使用して、特定のアダプターがリモートかローカルかを確認できます。DXGI_ADAPTER_DESC1 構造体の Flags フィールドが、アダプターがリモート (DXGI_ADAPTER_FLAG_REMOTE) かローカルかを示します。

typedef enum DXGI_ADAPTER_FLAG

{

DXGI_ADAPTER_FLAG_REMOTE      = 0x00000001;

DXGI_ADAPTER_FLAG_FORCE_DWORD = 0xFFFFFFFF;

} DXGI_ADAPTER_FLAG;

typedef struct DXGI_ADAPTER_DESC1 {

  WCHAR Description [128]; 

  UINT VendorId; 

  UINT DeviceId; 

  UINT SubSysId;

  UINT Revision;

  SIZE_T DedicatedVideoMemory; 

  SIZE_T DedicatedSystemMemory; 

  SIZE_T SharedSystemMemory; 

  LUID AdapterLuid; 

  DWORD Flags;  // アダプターがリモートかローカルかを示します。

} DXGI_ADAPTER_DESC1, *LPDXGI_ADAPTER_DESC1;

Direct3D 10.1 リモート レンダリングを使用するアプリケーションでは、ローカルのハードウェア アクセラレータ アプリケーションで一般には認識されないシナリオに遭遇します。つまり、アプリケーションが実行されているターミナル サービスのセッションでは、ローカル ユーザーやリモート ユーザーによる切断や再接続といった接続の変更、ネットワーク接続のエラー、サーバーとクライアント間の接続の再確立などが発生します。このような変化は、レンダリングに使用できるグラフィック アダプターに影響します。アプリケーションでは、この変化を適切に処理できなければなりません。

アダプター構成の変化の通知は、IDXGIFactory1 の新しい API IsCurrent を通じて取得できます。アプリケーションでは、変化が生じたときに、その IDXGIFactory1 を再作成して、IDXGIAdapter1 (1 つまたは複数) を再列挙します。

if (!pFactory1->IsCurrent())
ReEnumAdapters();</code></pre>

アダプター構成の変化を検出したら、DXGIFactory1 を再作成し、アダプターを再列挙して、最新のディスプレイ アダプターを使用してレンダリングを継続するのに必要な Direct3D 10.1 デバイス オブジェクトを再作成する必要があります。

HRESULT ReEnumAdapters()

{

 // DXGI ファクトリを作成してアダプターを再列挙します。

if (g_pFactory1) 

    g_pFactory1-&gt;Release();

CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)(&amp;g_pFactory1)); 

pNewAdapter1 = FindBestAdapter();



// 現在のアダプターを新しいアダプターと比較します。

BOOL AdaptersEquivalent = CompareAdapters(g_pCurrentAdapter1, pNewAdapter1);

// 現在のアダプターが新しいアダプターと異なる場合...

if ( !AdaptersEquivalent )

{

    //現在のアダプターのデバイス オブジェクトをクリーンアップします。

    CleanupDevice();

    //新しいアダプターを現在のアダプターに設定し、デバイスを再度初期化します。

    g_pCurrentAdapter1 = pNewAdapter1;

    if (g_pCurrentAdapter1)

        InitDevice();   // D3D10.1 デバイス、スワップ チェーン

                // などを再作成します。

    // 新しいアダプターが NULL の場合やデバイスの作成に失敗した場合は、クリーンアップします。

    if ( !g_pCurrentAdapter1 || FAILED(hr))

    {

        // デバイス オブジェクトをクリーンアップします。

        CleanupDevice();

        if ( g_pCurrentAdapter1) g_pCurrentAdapter1-&gt;Release();

        if ( g_pFactory1 ) g_pFactory1-&gt;Release();

        return E_FAIL;

    } 

}

// アダプターが同じである場合は、新しいアダプターをクリーンアップします。

else

{   

    if (pNewAdapter1)

        pNewAdapter1-&gt;Release();

}

return hr;

}

アダプターの列挙は、DXGI1.1、ランタイム、および Direct3D 10.1 リモート レンダリングでの変更の結果として変化します。次の図と表で、アダプターが列挙される方法と、Windows Vista® との違いを示します。

  • リモート アダプターは、他のすべてのアダプターより前に列挙されます。
  • 出力を備えるアダプターは、出力を備えないアダプターよりも前に列挙されます。
  • 出力は、リモート アダプターかローカル アダプターのどちらかにアタッチされますが、両方にはアタッチされません。

構成の例を次に示します。

構成の例

上の図の見方:

  • LA = ローカル アダプター
  • RA = リモート アダプター
  • O = 出力
  • W = シングル モニター、ウィンドウ表示出力

次に、この構成の例が、次の 3 つの場合に、従来の API と新しい API でどのように表されるかを示します。

  1. ターミナル サービス接続なし
  2. シングル モニター リモート接続
  3. マルチモニター リモート接続

リモート レンダリングの新しい基本動作には、アダプターおよび出力が列挙される方法への変更が含まれています。出力を備えていないものを含めて、すべてのローカル アダプターが列挙されます。これは、すべてのアダプターが少なくとも 1 つの出力を備えているという不変性を維持する現状の動作とは対照的です。

従来の API と新しい API

Direct3D 10.1 リモート レンダリングを使用する際に、アプリケーションの開発者が注意する必要がある変更点がいくつかあります。

Direct3D 10.1 リモート レンダリングを全画面表示専用モードにすることはできません。以下の理由で、全画面表示はサポートされません。

  • リモート クライアント コンピューターの表示モードが変化すると、ターミナル サービス クライアントは GDI と相互作用して、そのモード変化を処理する必要があります。また、モード変化をサーバー アプリケーションに反映する必要があり、クライアントからサーバーへのネットワーク通信にコストがかかります。
  • 全画面表示専用モードをローカルで実行されているシナリオと同等にするため、画面の印刷やガンマ設定などをサポートする必要があり、これを有効にするコストがかかります。

全画面表示専用モードをサポートしない結果として、次の API では、その機能を使用できないことを示すエラー コードが返されます。

  • DXGI_ERROR_NOT_CURRENTLY_AVAILABLE
  • GetGammaControlCapabilities
  • SetGammaControl
  • GetGammaControl
  • GetDisplaySurfaceData
  • SetFullscreenState (ウィンドウが最大表示されている場合のみ、正常終了が返されます)
  • MakeWindowAssociation
  • GetWindowAssociation
  • IDXGIOutput::TakeOwnership
  • IDXGIOutput::ReleaseOwnership
  • IDXGIOutput::SetDisplaySurface

アプリケーションがサーバー上で全画面表示専用モードで実行されているときにリモート接続が確立されると、アプリケーションでは、リモート クライアント デバイス上にレンダリングするために、DXGI ファクトリ、アダプター、およびデバイスを再列挙します。SetFullScreenState を呼び出しても、アプリケーションは全画面表示専用モードになりません。

IDXGISwapChain1::GetFullscreenState には、戻り値として S_OK がありますが、出力パラメーターは全画面状態が false であることを示します。

Direct3D 10.1 のカウンターは、GPU の使用率を調べる際にアプリケーションによって使用されます。クライアントからサーバーに返される情報がネットワーク転送によってかなり遅延するため、カウンターを調査するシナリオでのこの情報の有用性が低下します。一方、カウンターの調査を必要とするアプリケーションは、CAD アプリケーションというよりも主にリアルタイム ゲームです。Windows® 7 の Direct3D 10.1 リモート レンダリングを利用するアプリケーションとしては、どちらかといえば CAD アプリケーションを対象とします。サポートされない API は、ID3D10Device1::CheckCounterID3D10Device1::CheckCounterInfo です。

Windows 7 では、Direct3D 10.1 は DXGI と GDI の相互運用機能により、GDI と同じ HWND にレンダリングできます。DXGI 1.1 の IDXGISurface::GetDC API は、DXGI 表面のハードウェア デバイス コンテキストを取得します。このデバイス コンテキストを使用することで、アプリケーションは GDI の API を呼び出して、DXGI デバイスと同じ HWND にレンダリングすることができます。ただし、GDI と DXGI の相互運用機能とリモート Direct3D 10.1 を同時に使用するアプリケーションでは、リモート ハードウェア デバイス コンテキストを取得するために、リモート クライアントからサーバーに戻って読み取りを行う必要があると警告されます。こうしたやりとりは、低速でコストのかかるプロセスです。

ページのトップへ

(3) Direct2D アプリケーションで Direct3D 10.1 リモート レンダリングを使用する

Direct2D アプリケーションでは、開発オーバーヘッドをあまり生じることなく、Direct3D 10.1 リモート レンダリングを容易に使用できます。Direct2D ランタイムは、Direct2D のレンダー ターゲットが GDI と互換性のあるデバイスを使って作成されていない場合、リモート ディスプレイに、既定で Direct3D 10.1 リモート レンダリングを使用します。アダプター構成の変化に対処するため、Direct2D アプリケーションは D2DERR_RECREATE_TARGET エラーに応答する必要があります。Direct3D 10.1 リモート レンダリングを使用する際のその他の考慮事項のいくつかは、Direct2D にも該当します。

Direct2D ランタイムは、DXGI 1.1 API (CreateDXGIFactory1 や EnumAdapters など) を使用して、使用可能なリモート アダプターをすべて自動的に列挙します。Direct2D のレンダー ターゲットを作成する場合、Direct2D はリモート アダプター (使用可能な場合) とレンダリング コンテキストを関連付けようとします。ただし、次のような例外があります。

  • D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING が、D2D1_RENDER_TARGET_PROPERTIES の D2D1_RENDER_TARGET_USAGE フィールド内に設定されている場合。
  • レンダー ターゲットが、CreateDCRenderTarget を使用して作成された IDCRenderTarget の場合。

上記の場合はどちらも、レンダリングにローカル アダプターが使用されるため、ビットマップ リモート ディスプレイが強制的に使用されます。

アダプター構成の変化を処理するために、Direct2D アプリケーションでは、包括的な D2DERR_RECREATE_TARGET エラー リターンを使用して、ローカルとリモートの両方で、アダプター構成のすべての変化を検出できます。アプリケーションでは、変化の検出時に、レンダー ターゲットおよび Direct3D 10.1 デバイスに関連付けられているすべてのオブジェクトを解放して再作成します。

Direct2D アプリケーションの考慮事項は、Direct3D 10.1 リモート レンダリングを使用する際の Direct3D 10.1 アプリケーションの考慮事項と同じです。GDI および Direct3D 10.1 レンダリングが、IDXGISurface::GetDC および ReleaseDC が呼び出されているのと同じウィンドウに対して行われる場合は、Direct3D 10.1 リモート レンダリングによるパフォーマンスへの悪影響が Direct2D アプリケーションでも同じように生じます。

ページのトップへ


3. まとめ

Direct3D® 10.1 リモート レンダリングでは、リモート ディスプレイの使用状況に合わせて Direct3D 10.1 アプリケーションや Direct2D アプリケーションを最適化できる方法に強化機能が行われています。Direct3D 10.1 リモート レンダリングは、リッチ クライアントや、ヘッドレス サーバーのリモート ディスプレイに適しており、複数のリモート クライアント接続に対応する拡張性が備わっています。Direct3D 10.1 リモート レンダリングを使用して Direct2D のレンダリングを行う際のパフォーマンス上のメリットは、Direct3D 10.1 リモート レンダリングをアプリケーションに追加する開発作業を行う十分な価値があります。Direct3D 10.1 アプリケーションの開発者は、リモート ディスプレイのシナリオにおける各自のアプリケーションのパフォーマンス上の要求を最も満たすように、アプリケーションのリモート ディスプレイ動作を柔軟に変更できます。

4. 実施要請

  • アプリケーションの開発者には、Direct3D 10.1 リモート レンダリングを使用して、リモート ディスプレイのシナリオに優れたエクスペリエンスを提供するアプリケーションを開発することをお勧めします。
  • Windows アプリケーションの開発者には、Windows® 7 オペレーティング システムを対象とする Direct2D アプリケーションの作成に着手することを強くお勧めします。

5. 詳細情報

 

ページのトップへ